package dingo

// 错误统一处理包装

type ErrorWrap struct {
	Err  error
	Data []interface{}
}

func Wrap(err error, data ...interface{}) *ErrorWrap {
	return &ErrorWrap{Err: err, Data: data}
}

func (e *ErrorWrap) All() interface{} {
	if e.Err != nil {
		panic(e.Err)
	}
	return e.Data // all 取所有值
}

func (e *ErrorWrap) Unwrap() interface{} {
	if e.Err != nil {
		panic(e.Err)
	}
	if len(e.Data) >= 1 {
		return e.Data[0] // 取第一个值
	} else {
		return nil
	}
	return nil
}

func (e *ErrorWrap) Val() interface{} {
	if e.Err != nil {
		panic(e.Err)
	}
	if e.Data[1] != nil {
		return e.Data[1] // val 取第二个值
	}
	return nil
}

func (e *ErrorWrap) Else(v interface{}) interface{} {
	if e.Err != nil {
		return v
	}
	return e.Data[0]
}

func (e *ErrorWrap) ElseIf(f func() interface{}) interface{} {
	if e.Err != nil {
		return f()
	}
	return e.Data
}

// 业务类错误错误处理
func ErrorIf(err error, vals ...interface{}) *ErrorWrap {
	return Wrap(err, vals...)
}
